package org.oregami.util;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.persist.PersistService;
import com.google.inject.persist.jpa.JpaPersistModule;
import io.dropwizard.configuration.ConfigurationFactory;
import io.dropwizard.jackson.Jackson;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.oregami.dropwizard.OregamiConfiguration;
import org.oregami.dropwizard.OregamiGuiceModule;
import javax.persistence.PersistenceException;
import javax.validation.Validation;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* Created by sebastian on 06.04.15.
*/
public class StartHelper {
private static String jpaUnit = null;
private static Injector injector = null;
public static final String CONFIG_FILENAME_TEST = "src/test/resources/oregami_test.yml";
private static String configFilename;
public static String getConfigFilename() {
return configFilename;
}
public static void setConfigFilename(String configFilename) {
StartHelper.configFilename = configFilename;
}
public static Properties createPropertiesFromConfiguration(OregamiConfiguration localConfiguration) {
OregamiConfiguration.DatabaseConfiguration databaseConfiguration = localConfiguration.getDatabaseConfiguration();
List<String> propertiesList = new ArrayList<>();
propertiesList.add("hibernate.dialect");
propertiesList.add("hibernate.show_sql");
propertiesList.add("hibernate.hbm2ddl.auto");
propertiesList.add("hibernate.dialect");
propertiesList.add("hibernate.archive.autodetection");
propertiesList.add("hibernate.connection.driver_class");
propertiesList.add("hibernate.username");
propertiesList.add("hibernate.password");
Properties properties = new Properties();
if (databaseConfiguration.getUrl()!=null) {
properties.setProperty("javax.persistence.jdbc.url", databaseConfiguration.getUrl());
}
if (databaseConfiguration.getUser()!=null) {
properties.setProperty("javax.persistence.jdbc.user", databaseConfiguration.getUser());
}
if (databaseConfiguration.getPassword()!=null) {
properties.setProperty("javax.persistence.jdbc.password", databaseConfiguration.getPassword());
}
for (String p : propertiesList) {
String val = databaseConfiguration.getProperties().get(p);
if (val != null) {
properties.setProperty(p, val);
}
}
return properties;
}
public static Injector getInjector() {
if (injector == null) {
throw new RuntimeException("call StartHelper.init() first!");
}
return injector;
}
public static void init() {
init(CONFIG_FILENAME_TEST);
}
public static void init(String localConfigFilename) {
configFilename = localConfigFilename;
OregamiConfiguration configuration = createConfiguration(localConfigFilename);
Properties properties = createPropertiesFromConfiguration(configuration);
jpaUnit = configuration.getDatabaseConfiguration().getJpaUnit();
JpaPersistModule jpaPersistModule = new JpaPersistModule(jpaUnit);
jpaPersistModule.properties(properties);
injector = Guice.createInjector(jpaPersistModule, new OregamiGuiceModule());
try {
injector.getInstance(PersistService.class).start();
} catch (PersistenceException e) {
throw new RuntimeException("Database error", e);
}
}
public static OregamiConfiguration createConfiguration(String configFilename) {
ConfigurationFactory<OregamiConfiguration> factory =
new ConfigurationFactory<>(
OregamiConfiguration.class,
Validation.buildDefaultValidatorFactory().getValidator(),
Jackson.newObjectMapper(),
""
);
OregamiConfiguration configuration;
try {
configuration = factory.build(new File(configFilename));
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println(ToStringBuilder.reflectionToString(configuration, ToStringStyle.MULTI_LINE_STYLE));
System.out.println(ToStringBuilder.reflectionToString(configuration.getDatabaseConfiguration(), ToStringStyle.MULTI_LINE_STYLE));
return configuration;
}
public static <T> T getInstance(Class<T> c) {
return getInjector().getInstance(c);
}
public static String getJpaUnit() {
return jpaUnit;
}
}